/***********************************************************************************
 * 文件名： page_menu.c
 * 版本： 1
 * 说明：
 * 		菜单页面
 * 修改记录：
 * 	2024/01/11: 初版。 刘言。
***********************************************************************************/
#include "page_menu.h"
#include "resource.h"
#include "ui_ctrl.h"
#include "../dmu.h"
#include "../app.h"
#include "components/lcd_drivers/lcd.h"
#include "components/lcd_drivers/simple_gui/sgui.h"
#include "components/umi/umi_static.h"


/////////////////////// 自定义类型

// 页面类
typedef struct _page_menu
{
    // 继承页面基类
    ui_page_base_t Base;    // 必须放在最开始表示继承(实例地址=本结构体实例地址)

    sg_pic_t PicItem[5];

    u8 Timeout;
    u8 Select;
}page_t;


/////////////////////// 内部函数申明

static void TimerIsr(void *user_data);
static void BtnEvent(btn_ev_t e, void *user_data);
static void UpdateCurser(page_t *this);


/////////////////////// 事件

// 页面事件
static void PageEvent(ui_ev_t *e)
{
    switch (e->Code)
    {
    case UI_EV_PAGE_LOADED:
        Btn_SetCb(BtnEvent, e->Target);
        Polsys_SetEntry(&PublicTimer, TimerIsr, e->Target);
        Polsys_SetInterval(&PublicTimer, 100);
        break;
    case UI_EV_PAGE_UNLOADED:
        Polsys_SetEntry(&PublicTimer, NULL, NULL);
        Btn_SetCb(NULL, NULL);
        break;
    default:
        break;
    }
}

/**
 * 软定时器
*/
static void TimerIsr(void *user_data)
{
    page_t *this = (page_t *)user_data;
    this->Timeout++;
    if(this->Timeout >= 50)
    {
        Ui_SwitchToPage(Page_CreatNumMain, NULL);
    }
}

static void BtnEvent(btn_ev_t e, void *user_data)
{
    page_t *this = user_data;
    App_ClrIdleTime();
    this->Timeout = 0;
    switch(e)
    {
    case BTN_EV_LONG_PRESS:
        switch(this->Select)
        {
        case 0:
        {
            // 设置模式 power
            u8 Autoset = 0;
            Umi_Write(0X0202, &Autoset, 1);
            Ui_SwitchToPage(Page_CreatNumMain, (void *)2);
            break;
        }
        case 1:
        {
            // 设置模式 smart
            u8 Autoset = 1;
            Umi_Write(0X0202, &Autoset, 1);
            Ui_SwitchToPage(Page_CreatNumMain, (void *)2);
            break;
        }
        case 2:
            Ui_SwitchToPage(Page_CreatNumMain, NULL);   // 切换到主题设置页面！！！！！！！！！！！
            break;
        case 3:
        {
            // 清除小计口数
            u32 buff[2] = {0, 0};
            Umi_Write(0x0108, (u8 *)buff, 8);
            Ui_SwitchToPage(Page_CreatWarn, (void *)UI_WARN_CLEAR_PUFF);
            break;
        }
        case 4:
            Ui_SwitchToPage(Page_CreatNumMain, NULL);
            break;
        default: break;
        }
        break;
    case BTN_EV_UP:
        this->Select++;
        if(this->Select >= 5)this->Select = 0;
        UpdateCurser(this);
        break;
    default: break;
    }
}

/////////////////////// 删除

/**
 * 删除页面。
 * 在这里释放页面占用的所有内存，如果有必要可以清除显示。
*/
static void DeletePage(ui_page_base_t *page)
{
    free(page);
    // Lcd_Clear(0, 0, LCD_SIZE_X - 1, LCD_SIZE_Y - 1);
}

///////////////////////////////////// 内部其他函数

static const u32 PicList[5] = {
    PIC_T0_MENU_POWER_ADDR,
    PIC_T0_MENU_SMART_ADDR,
    PIC_T0_MENU_THEME_ADDR,
    PIC_T0_MENU_PUFF_ADDR,
    PIC_T0_MENU_EXIT_ADDR
};

static const u32 ActPicList[5] = {
    PIC_T0_MENU_POWER_A_ADDR,
    PIC_T0_MENU_SMART_A_ADDR,
    PIC_T0_MENU_THEME_A_ADDR,
    PIC_T0_MENU_PUFF_A_ADDR,
    PIC_T0_MENU_EXIT_A_ADDR
};

static void UpdateCurser(page_t *this)
{
    u8 last = this->Select - 1;
    if(last == 255) last = 4;
    SgPic_setSource(&this->PicItem[last], PicList[last]);
    SgPic_setSource(&this->PicItem[this->Select], ActPicList[this->Select]);
}


/////////////////////// 创建


ui_page_base_t * Page_CreatMenu(void *param)
{
    int i;

    page_t *page = malloc(sizeof(page_t));
    memset(page, 0, sizeof(page_t));

    Ui_PageBaseInit((ui_page_base_t *)page);
    Ui_PageSetDeleteFun((ui_page_base_t *)page, DeletePage);
    Ui_PageSetCb((ui_page_base_t *)page, PageEvent);

    // 加载背景
    Lcd_Clear(0, 0, LCD_SIZE_X - 1, LCD_SIZE_Y - 1);

    for(i = 0; i < 5; i++)
    {
        SgPic_init(&page->PicItem[i]);
        SgObj_setPosition(&page->PicItem[i], 15, 32 + 18 * i);
        SgObj_setSize(&page->PicItem[i], PIC_T0_MENU_POWER_SIZE_X, PIC_T0_MENU_POWER_SIZE_Y);
        SgPic_setSource(&page->PicItem[i], PicList[i]);
    }

    UpdateCurser(page);

    return (ui_page_base_t *)page;
}

